package com.learn.multi_thread.A_BaseThread.B_Synchronized;

public class TicketThreadForThread extends Thread {
//    int ticket = 0;  出现多个窗口卖同一张票的问题
    static int ticket = 0; // 任然会有少量出现多个窗口卖同一张票的问题，且有超卖的问题

    static final Object lockObject = new Object();

    /**
     *  同步代码块注意点
     *  1. 同步代码块不能在while循环外，否则同步代码块失效的问题，否则会出现单个线程把所有的票卖完的问题
     *  2. 锁对象必须唯一，否侧失去了同步代码块的作用
     */
    @Override
    public void run() {
        while (true) {
            synchronized (lockObject) {
                if (ticket < 100) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.println(
                            Thread.currentThread().getName() + "正在卖第" + (++ticket) + "张票"
                    );
                } else {
                    break;
                }
            }
        }
    }
}
